--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / tests / frontend / MessageSendingFailures.test.js
Displaying Raw • Download
tests/frontend/MessageSendingFailures.test.js ec74a2651e897325b14269ae52d11b1e12f0b6e2 (ec74a265) Text, 12.04 KB
Tff7b72import Tb4b4b4{ Te6edf3mount Tb4b4b4} Tff7b72from Ta5d6ff"@vue/test-utils"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3describeTb4b4b4, Te6edf3itTb4b4b4, Te6edf3expectTb4b4b4, Te6edf3viTb4b4b4, Te6edf3beforeEachTb4b4b4, Te6edf3afterEach Tb4b4b4} Tff7b72from Ta5d6ff"vitest"Tb4b4b4;
Tff7b72import Te6edf3ConversationViewer Tff7b72from Ta5d6ff"@/components/messages/ConversationViewer.vue"Tb4b4b4;
Tff7b72import Te6edf3WebSocketConnection Tff7b72from Ta5d6ff"@/js/WebSocketConnection"Tb4b4b4;
Tff7b72import Te6edf3GlobalState Tff7b72from Ta5d6ff"@/js/GlobalState"Tb4b4b4;
Tff7b72import Te6edf3DialogUtils Tff7b72from Ta5d6ff"@/js/DialogUtils"Tb4b4b4;
Tff7b72import Te6edf3ToastUtils Tff7b72from Ta5d6ff"@/js/ToastUtils"Tb4b4b4;
Te6edf3describeTb4b4b4(Ta5d6ff"MessageSendingFailures.test.js"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72let Te6edf3axiosMockTb4b4b4;
Te6edf3beforeEachTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3GlobalStateTb4b4b4.Te6edf3configTb4b4b4.Te6edf3theme Tff7b72= Ta5d6ff"light"Tb4b4b4;
Te6edf3GlobalStateTb4b4b4.Te6edf3configTb4b4b4.Te6edf3message_outbound_bubble_color Tff7b72= Ta5d6ff"#4f46e5"Tb4b4b4;
Te6edf3GlobalStateTb4b4b4.Te6edf3configTb4b4b4.Te6edf3message_waiting_bubble_color Tff7b72= Ta5d6ff"#e5e7eb"Tb4b4b4;
Te6edf3WebSocketConnectionTb4b4b4.Te6edf3connectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3axiosMock Tff7b72= Tb4b4b4{
Te6edf3getTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3mockImplementationTb4b4b4(Tb4b4b4(Te6edf3urlTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3urlTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/path"Tb4b4b4)Tb4b4b4) Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3pathTff7b72: Tb4b4b4[Tb4b4b4] Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3urlTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/stamp-info"Tb4b4b4)Tb4b4b4) Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3stamp_infoTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3urlTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/lxmf-messages/conversation/"Tb4b4b4)Tb4b4b4)
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3lxmf_messagesTff7b72: Tb4b4b4[Tb4b4b4] Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3postTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3mockImplementationTb4b4b4(Tb4b4b4(Te6edf3urlTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3url Tff7b72=== Ta5d6ff"string" Tff7b72&& Tb4b4b4(Te6edf3urlTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/request-path"Tb4b4b4) Tff7b72|| Te6edf3urlTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/drop-path"Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3lxmf_messageTff7b72: Tb4b4b4{ Te6edf3hashTff7b72: Ta5d6ff"mock" Tb4b4b4} Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tff7b72deleteTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3mockResolvedValueTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tffa657windowTb4b4b4.Te6edf3api Tff7b72= Te6edf3axiosMockTb4b4b4;
T8b949e// Mock URL.createObjectURL
Tffa657windowTb4b4b4.Te6edf3URLTb4b4b4.Te6edf3createObjectURL Tff7b72= Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Ta5d6ff"mock-url"Tb4b4b4)Tb4b4b4;
Te6edf3viTb4b4b4.Te6edf3spyOnTb4b4b4(Tffa657windowTb4b4b4, Ta5d6ff"open"Tb4b4b4)Tb4b4b4.Te6edf3mockImplementationTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tff7b72nullTb4b4b4)Tb4b4b4;
Te6edf3viTb4b4b4.Te6edf3spyOnTb4b4b4(Te6edf3DialogUtilsTb4b4b4, Ta5d6ff"confirm"Tb4b4b4)Tb4b4b4.Te6edf3mockResolvedValueTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3viTb4b4b4.Te6edf3spyOnTb4b4b4(Te6edf3DialogUtilsTb4b4b4, Ta5d6ff"alert"Tb4b4b4)Tb4b4b4.Te6edf3mockImplementationTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3viTb4b4b4.Te6edf3spyOnTb4b4b4(Te6edf3ToastUtilsTb4b4b4, Ta5d6ff"error"Tb4b4b4)Tb4b4b4.Te6edf3mockImplementationTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3afterEachTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72delete Tffa657windowTb4b4b4.Te6edf3apiTb4b4b4;
Te6edf3viTb4b4b4.Te6edf3unstubAllGlobalsTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3WebSocketConnectionTb4b4b4.Te6edf3destroyTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3viTb4b4b4.Te6edf3restoreAllMocksTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3mountConversationViewer Tff7b72= Tb4b4b4(Te6edf3props Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72return Te6edf3mountTb4b4b4(Te6edf3ConversationViewerTb4b4b4, Tb4b4b4{
Te6edf3propsTff7b72: Tb4b4b4{
Te6edf3selectedPeerTff7b72: Tb4b4b4{ Te6edf3destination_hashTff7b72: Ta5d6ff"test-hash"Tb4b4b4, Te6edf3display_nameTff7b72: Ta5d6ff"Test Peer" Tb4b4b4}Tb4b4b4,
Te6edf3myLxmfAddressHashTff7b72: Ta5d6ff"my-hash"Tb4b4b4,
Te6edf3conversationsTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Tb4b4b4...Te6edf3propsTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tffa657globalTff7b72: Tb4b4b4{
Te6edf3directivesTff7b72: Tb4b4b4{ Ta5d6ff"click-outside"Tff7b72: Tb4b4b4{ Te6edf3mountedTff7b72: Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{Tb4b4b4}Tb4b4b4, Te6edf3unmountedTff7b72: Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{Tb4b4b4} Tb4b4b4} Tb4b4b4}Tb4b4b4,
Te6edf3mocksTff7b72: Tb4b4b4{
Te6edf3$tTff7b72: Tb4b4b4(Te6edf3keyTb4b4b4) Tb4b4b4=> Te6edf3keyTb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3stubsTff7b72: Tb4b4b4{
Te6edf3MaterialDesignIconTff7b72: Tff7b72trueTb4b4b4,
Te6edf3AddImageButtonTff7b72: Tff7b72trueTb4b4b4,
Te6edf3AddAudioButtonTff7b72: Tff7b72trueTb4b4b4,
Te6edf3SendMessageButtonTff7b72: Tff7b72trueTb4b4b4,
Te6edf3ConversationDropDownMenuTff7b72: Tff7b72trueTb4b4b4,
Te6edf3PaperMessageModalTff7b72: Tff7b72trueTb4b4b4,
Te6edf3AudioWaveformPlayerTff7b72: Tff7b72trueTb4b4b4,
Te6edf3LxmfUserIconTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"handles API 503 failure when sending message"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3axiosMockTb4b4b4.Te6edf3postTb4b4b4.Te6edf3mockImplementationTb4b4b4(Tb4b4b4(Te6edf3urlTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3url Tff7b72=== Ta5d6ff"string" Tff7b72&& Te6edf3urlTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/lxmf-messages/send"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3rejectTb4b4b4(Tb4b4b4{
Te6edf3responseTff7b72: Tb4b4b4{
Te6edf3statusTff7b72: T79c0ff503Tb4b4b4,
Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3messageTff7b72: Ta5d6ff"Sending failed" Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3wrapper Tff7b72= Te6edf3mountConversationViewerTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3newMessageText Tff7b72= Ta5d6ff"Hello failure"Tb4b4b4;
Tff7b72await Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3sendMessageTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3viTb4b4b4.Te6edf3waitForTb4b4b4(
Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledWithTb4b4b4(Ta5d6ff"Sending failed"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3timeoutTff7b72: T79c0ff5000 Tb4b4b4}
Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3pendingItems Tff7b72= Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4(Te6edf3itemTb4b4b4) Tb4b4b4=> Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hashTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"pending-"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3pendingItemsTb4b4b4)Tb4b4b4.Te6edf3toHaveLengthTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"sends plain text when crypto.randomUUID is unavailable (non-secure context)"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4.Te6edf3mockClearTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3c Tff7b72= Tffa657globalThisTb4b4b4.Te6edf3cryptoTb4b4b4;
Te6edf3viTb4b4b4.Te6edf3stubGlobalTb4b4b4(Ta5d6ff"crypto"Tb4b4b4, Tb4b4b4{
Tb4b4b4...Te6edf3cTb4b4b4,
Te6edf3getRandomValuesTff7b72: Te6edf3cTb4b4b4.Te6edf3getRandomValuesTb4b4b4.Te6edf3bindTb4b4b4(Te6edf3cTb4b4b4)Tb4b4b4,
Te6edf3randomUUIDTff7b72: Tff7b72undefinedTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3wrapper Tff7b72= Te6edf3mountConversationViewerTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3peerPathSnapshot Tff7b72= Tb4b4b4{
Te6edf3pathTff7b72: Tb4b4b4{ Te6edf3hopsTff7b72: T79c0ff1 Tb4b4b4}Tb4b4b4,
Te6edf3path_staleTff7b72: Tff7b72falseTb4b4b4,
Te6edf3path_unresponsiveTff7b72: Tff7b72falseTb4b4b4,
Tb4b4b4}Tb4b4b4;
Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3newMessageText Tff7b72= Ta5d6ff"http LAN host"Tb4b4b4;
Tff7b72await Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3sendMessageTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3viTb4b4b4.Te6edf3waitForTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3sendCalls Tff7b72= Te6edf3axiosMockTb4b4b4.Te6edf3postTb4b4b4.Te6edf3mockTb4b4b4.Te6edf3callsTb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4(Te6edf3cTb4b4b4) Tb4b4b4=> Te6edf3cTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72=== Ta5d6ff"/api/v1/lxmf-messages/send"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3sendCallsTb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4.Te6edf3toBeGreaterThanTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toHaveBeenCalledTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3axiosMockTb4b4b4.Te6edf3postTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledWithTb4b4b4(
Ta5d6ff"/api/v1/lxmf-messages/send"Tb4b4b4,
Te6edf3expectTb4b4b4.Te6edf3objectContainingTb4b4b4(Tb4b4b4{
Te6edf3lxmf_messageTff7b72: Te6edf3expectTb4b4b4.Te6edf3objectContainingTb4b4b4(Tb4b4b4{
Te6edf3contentTff7b72: Ta5d6ff"http LAN host"Tb4b4b4,
Te6edf3destination_hashTff7b72: Ta5d6ff"test-hash"Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3someTb4b4b4(Tb4b4b4(Te6edf3itemTb4b4b4) Tb4b4b4=> Te6edf3itemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hash Tff7b72=== Ta5d6ff"mock"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"warms path before direct send when peer path is missing"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3wrapper Tff7b72= Te6edf3mountConversationViewerTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3peerPathSnapshot Tff7b72= Tb4b4b4{ Te6edf3pathTff7b72: Tff7b72nullTb4b4b4, Te6edf3path_staleTff7b72: Tff7b72trueTb4b4b4, Te6edf3path_unresponsiveTff7b72: Tff7b72false Tb4b4b4}Tb4b4b4;
Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3newMessageText Tff7b72= Ta5d6ff"need path"Tb4b4b4;
Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3newMessageDeliveryMethod Tff7b72= Ta5d6ff"direct"Tb4b4b4;
Tff7b72await Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3sendMessageTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3viTb4b4b4.Te6edf3waitForTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3axiosMockTb4b4b4.Te6edf3postTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledWithTb4b4b4(Ta5d6ff"/api/v1/destination/test-hash/request-path"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3axiosMockTb4b4b4.Te6edf3postTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledWithTb4b4b4(
Ta5d6ff"/api/v1/lxmf-messages/send"Tb4b4b4,
Te6edf3expectTb4b4b4.Te6edf3objectContainingTb4b4b4(Tb4b4b4{
Te6edf3delivery_methodTff7b72: Ta5d6ff"direct"Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"skips path warm for propagated delivery"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3wrapper Tff7b72= Te6edf3mountConversationViewerTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3peerPathSnapshot Tff7b72= Tb4b4b4{ Te6edf3pathTff7b72: Tff7b72nullTb4b4b4, Te6edf3path_staleTff7b72: Tff7b72trueTb4b4b4, Te6edf3path_unresponsiveTff7b72: Tff7b72false Tb4b4b4}Tb4b4b4;
Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3newMessageText Tff7b72= Ta5d6ff"via prop"Tb4b4b4;
Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3newMessageDeliveryMethod Tff7b72= Ta5d6ff"propagated"Tb4b4b4;
Tff7b72await Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3sendMessageTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3viTb4b4b4.Te6edf3waitForTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3axiosMockTb4b4b4.Te6edf3postTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledWithTb4b4b4(
Ta5d6ff"/api/v1/lxmf-messages/send"Tb4b4b4,
Te6edf3expectTb4b4b4.Te6edf3objectContainingTb4b4b4(Tb4b4b4{
Te6edf3delivery_methodTff7b72: Ta5d6ff"propagated"Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3pathWarmCalls Tff7b72= Te6edf3axiosMockTb4b4b4.Te6edf3postTb4b4b4.Te6edf3mockTb4b4b4.Te6edf3callsTb4b4b4.Te6edf3filterTb4b4b4(
Tb4b4b4(Te6edf3cTb4b4b4) Tb4b4b4=> Tff7b72typeof Te6edf3cTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72=== Ta5d6ff"string" Tff7b72&& Te6edf3cTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/request-path"Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3pathWarmCallsTb4b4b4)Tb4b4b4.Te6edf3toHaveLengthTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"updates UI when message state becomes failed via WebSocket"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3wrapper Tff7b72= Te6edf3mountConversationViewerTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3messageHash Tff7b72= Ta5d6ff"msg-123"Tb4b4b4;
T8b949e// Add a message that is currently "sending"
Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"lxmf_message"Tb4b4b4,
Te6edf3is_outboundTff7b72: Tff7b72trueTb4b4b4,
Te6edf3lxmf_messageTff7b72: Tb4b4b4{
Te6edf3hashTff7b72: Te6edf3messageHashTb4b4b4,
Te6edf3contentTff7b72: Ta5d6ff"Going to fail"Tb4b4b4,
Te6edf3stateTff7b72: Ta5d6ff"sending"Tb4b4b4,
Te6edf3progressTff7b72: T79c0ff50Tb4b4b4,
Te6edf3destination_hashTff7b72: Ta5d6ff"test-hash"Tb4b4b4,
Te6edf3source_hashTff7b72: Ta5d6ff"my-hash"Tb4b4b4,
Te6edf3fieldsTff7b72: Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e// Simulate WebSocket update
Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3onLxmfMessageUpdatedTb4b4b4(Tb4b4b4{
Te6edf3hashTff7b72: Te6edf3messageHashTb4b4b4,
Te6edf3stateTff7b72: Ta5d6ff"failed"Tb4b4b4,
Te6edf3progressTff7b72: T79c0ff50Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3updatedItem Tff7b72= Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3findTb4b4b4(Tb4b4b4(Te6edf3iTb4b4b4) Tb4b4b4=> Te6edf3iTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hash Tff7b72=== Te6edf3messageHashTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3updatedItemTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3stateTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff"failed"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3$nextTickTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// The retry button should be visible in the context menu if we were to open it
T8b949e// (Testing the logic of onLxmfMessageUpdated is enough here as retry logic is tested elsewhere)
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"handles second image failure in multi-image send"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3wrapper Tff7b72= Te6edf3mountConversationViewerTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3peerPathSnapshot Tff7b72= Tb4b4b4{
Te6edf3pathTff7b72: Tb4b4b4{ Te6edf3hopsTff7b72: T79c0ff1 Tb4b4b4}Tb4b4b4,
Te6edf3path_staleTff7b72: Tff7b72falseTb4b4b4,
Te6edf3path_unresponsiveTff7b72: Tff7b72falseTb4b4b4,
Tb4b4b4}Tb4b4b4;
Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3newMessageText Tff7b72= Ta5d6ff"Two images"Tb4b4b4;
Tff7b72const Te6edf3image1 Tff7b72= Tff7b72new Te6edf3FileTb4b4b4(Tb4b4b4[Ta5d6ff""Tb4b4b4]Tb4b4b4, Ta5d6ff"image1.png"Tb4b4b4, Tb4b4b4{ Te6edf3typeTff7b72: Ta5d6ff"image/png" Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3image2 Tff7b72= Tff7b72new Te6edf3FileTb4b4b4(Tb4b4b4[Ta5d6ff""Tb4b4b4]Tb4b4b4, Ta5d6ff"image2.png"Tb4b4b4, Tb4b4b4{ Te6edf3typeTff7b72: Ta5d6ff"image/png" Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3image1Tb4b4b4.Te6edf3arrayBuffer Tff7b72= Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tff7b72new Tffa657ArrayBufferTb4b4b4(T79c0ff8Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3image2Tb4b4b4.Te6edf3arrayBuffer Tff7b72= Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tff7b72new Tffa657ArrayBufferTb4b4b4(T79c0ff8Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3onImageSelectedTb4b4b4(Te6edf3image1Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3onImageSelectedTb4b4b4(Te6edf3image2Tb4b4b4)Tb4b4b4;
Tff7b72let Te6edf3sendCount Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3axiosMockTb4b4b4.Te6edf3postTb4b4b4.Te6edf3mockImplementationTb4b4b4(Tb4b4b4(Te6edf3urlTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3url Tff7b72=== Ta5d6ff"string" Tff7b72&& Tb4b4b4(Te6edf3urlTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/request-path"Tb4b4b4) Tff7b72|| Te6edf3urlTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/drop-path"Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3url Tff7b72=== Ta5d6ff"string" Tff7b72&& Te6edf3urlTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/lxmf-messages/send"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3sendCount Tff7b72+= T79c0ff1Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sendCount Tff7b72=== T79c0ff1Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{
Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3lxmf_messageTff7b72: Tb4b4b4{ Te6edf3hashTff7b72: Ta5d6ff"hash-1"Tb4b4b4, Te6edf3contentTff7b72: Ta5d6ff"Two images"Tb4b4b4, Te6edf3stateTff7b72: Ta5d6ff"outbound" Tb4b4b4} Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3rejectTb4b4b4(Tb4b4b4{ Te6edf3responseTff7b72: Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3messageTff7b72: Ta5d6ff"Second image failed" Tb4b4b4} Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3consoleSpy Tff7b72= Te6edf3viTb4b4b4.Te6edf3spyOnTb4b4b4(Te6edf3consoleTb4b4b4, Ta5d6ff"error"Tb4b4b4)Tb4b4b4.Te6edf3mockImplementationTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3sendMessageTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3viTb4b4b4.Te6edf3waitForTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3sendCountTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3consoleSpyTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledWithTb4b4b4(Te6edf3expectTb4b4b4.Te6edf3stringContainingTb4b4b4(Ta5d6ff"Failed to send image 2"Tb4b4b4)Tb4b4b4, Te6edf3expectTb4b4b4.Te6edf3anythingTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3consoleSpyTb4b4b4.Te6edf3mockRestoreTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"removes placeholder even if buildOutboundJobSnapshot fails"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3wrapper Tff7b72= Te6edf3mountConversationViewerTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3newMessageText Tff7b72= Ta5d6ff"Fail early"Tb4b4b4;
Te6edf3viTb4b4b4.Te6edf3spyOnTb4b4b4(Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4, Ta5d6ff"buildOutboundJobSnapshot"Tb4b4b4)Tb4b4b4.Te6edf3mockRejectedValueOnceTb4b4b4(Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff"Snapshot failed"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3sendMessageTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledWithTb4b4b4(Ta5d6ff"Snapshot failed"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3chatItemsTb4b4b4)Tb4b4b4.Te6edf3toHaveLengthTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"retrying a failed message sends it again"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3wrapper Tff7b72= Te6edf3mountConversationViewerTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3failedItem Tff7b72= Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"lxmf_message"Tb4b4b4,
Te6edf3is_outboundTff7b72: Tff7b72trueTb4b4b4,
Te6edf3lxmf_messageTff7b72: Tb4b4b4{
Te6edf3hashTff7b72: Ta5d6ff"failed-hash"Tb4b4b4,
Te6edf3stateTff7b72: Ta5d6ff"failed"Tb4b4b4,
Te6edf3contentTff7b72: Ta5d6ff"retry me"Tb4b4b4,
Te6edf3destination_hashTff7b72: Ta5d6ff"test-hash"Tb4b4b4,
Te6edf3source_hashTff7b72: Ta5d6ff"my-hash"Tb4b4b4,
Te6edf3fieldsTff7b72: Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3chatItems Tff7b72= Tb4b4b4[Te6edf3failedItemTb4b4b4]Tb4b4b4;
Te6edf3axiosMockTb4b4b4.Te6edf3postTb4b4b4.Te6edf3mockResolvedValueTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3lxmf_messageTff7b72: Tb4b4b4{ Te6edf3hashTff7b72: Ta5d6ff"new-hash"Tb4b4b4, Te6edf3stateTff7b72: Ta5d6ff"outbound" Tb4b4b4} Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3retrySendingMessageTb4b4b4(Te6edf3failedItemTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3axiosMockTb4b4b4.Te6edf3postTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledWithTb4b4b4(
Ta5d6ff"/api/v1/lxmf-messages/send"Tb4b4b4,
Te6edf3expectTb4b4b4.Te6edf3objectContainingTb4b4b4(Tb4b4b4{
Te6edf3lxmf_messageTff7b72: Te6edf3expectTb4b4b4.Te6edf3objectContainingTb4b4b4(Tb4b4b4{
Te6edf3contentTff7b72: Ta5d6ff"retry me"Tb4b4b4,
Te6edf3destination_hashTff7b72: Ta5d6ff"test-hash"Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Tb4b4b4)Tb4b4b4;
T8b949e// Old item should be removed
Te6edf3expectTb4b4b4(Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3findTb4b4b4(Tb4b4b4(Te6edf3iTb4b4b4) Tb4b4b4=> Te6edf3iTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hash Tff7b72=== Ta5d6ff"failed-hash"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeUndefinedTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// New item should be added
Te6edf3expectTb4b4b4(Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3chatItemsTb4b4b4.Te6edf3findTb4b4b4(Tb4b4b4(Te6edf3iTb4b4b4) Tb4b4b4=> Te6edf3iTb4b4b4.Te6edf3lxmf_messageTb4b4b4.Te6edf3hash Tff7b72=== Ta5d6ff"new-hash"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeDefinedTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────